-
Notifications
You must be signed in to change notification settings - Fork 32
[FSSDK-11170] update: decision service methods for cmab #583
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
[FSSDK-11170] update: decision service methods for cmab #583
Conversation
…e to support CMAB UUID handling
…and include CMAB UUIDs in responses
…ils for CMAB configuration
…ations over CMAB service decisions in DecisionService
…tly verify error state
…izely and DecisionService
…text and related fetcher classes
muzahidul-opti
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Changes look good to me. Added few comments.
core-api/src/main/java/com/optimizely/ab/optimizelydecision/DecisionResponse.java
Show resolved
Hide resolved
core-api/src/main/java/com/optimizely/ab/bucketing/Bucketer.java
Outdated
Show resolved
Hide resolved
core-api/src/main/java/com/optimizely/ab/bucketing/Bucketer.java
Outdated
Show resolved
Hide resolved
core-api/src/main/java/com/optimizely/ab/optimizelydecision/AsyncDecisionsFetcher.java
Outdated
Show resolved
Hide resolved
…ecision responses
…ent key retrieval
…eation in CMAB client
…hance decision handling
core-api/src/main/java/com/optimizely/ab/cmab/client/CmabClientHelper.java
Show resolved
Hide resolved
muzahidul-opti
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
jaeopt
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A few changes in API definitions. Can you refactor them first?
I need more time to review the cmab logic.
| String flagKey = flagsWithoutForcedDecision.get(i).getKey(); | ||
|
|
||
| if (error) { | ||
| OptimizelyDecision optimizelyDecision = OptimizelyDecision.newErrorDecision(flagKey, user, DecisionMessage.CMAB_ERROR.reason(experimentKey)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we always report CMAB error for any decision errors? Is this safe?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As far as I understand, we get error from decision service only when cmab fails. So this error flag is only true for cmab errors. @raju-opti can verify.
core-api/src/main/java/com/optimizely/ab/OptimizelyUserContext.java
Outdated
Show resolved
Hide resolved
core-api/src/main/java/com/optimizely/ab/OptimizelyUserContext.java
Outdated
Show resolved
Hide resolved
core-api/src/main/java/com/optimizely/ab/OptimizelyUserContext.java
Outdated
Show resolved
Hide resolved
core-api/src/main/java/com/optimizely/ab/OptimizelyUserContext.java
Outdated
Show resolved
Hide resolved
core-api/src/main/java/com/optimizely/ab/OptimizelyUserContext.java
Outdated
Show resolved
Hide resolved
core-api/src/main/java/com/optimizely/ab/bucketing/DecisionService.java
Outdated
Show resolved
Hide resolved
core-api/src/main/java/com/optimizely/ab/bucketing/DecisionService.java
Outdated
Show resolved
Hide resolved
core-api/src/main/java/com/optimizely/ab/bucketing/Bucketer.java
Outdated
Show resolved
Hide resolved
core-api/src/main/java/com/optimizely/ab/bucketing/DecisionService.java
Outdated
Show resolved
Hide resolved
… backward compatibility for mobile apps
… decisions in OptimizelyUserContext
…rContextTest for consistency
…od for consistency
jaeopt
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A few more suggestions at the top level.
core-api/src/main/java/com/optimizely/ab/OptimizelyUserContext.java
Outdated
Show resolved
Hide resolved
core-api/src/main/java/com/optimizely/ab/OptimizelyUserContext.java
Outdated
Show resolved
Hide resolved
core-api/src/main/java/com/optimizely/ab/OptimizelyUserContext.java
Outdated
Show resolved
Hide resolved
Co-authored-by: Jae Kim <45045038+jaeopt@users.noreply.github.com>
…larity and maintainability
Co-authored-by: Jae Kim <45045038+jaeopt@users.noreply.github.com>
Co-authored-by: Jae Kim <45045038+jaeopt@users.noreply.github.com>
…ckage-private and add copyright notice to DecisionPath
…and OptimizelyUserContext with corresponding tests
…ndency and adjust related tests
…and enhance builder methods for cache configuration
jaeopt
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I see it's now more aligned with android-sdk. I added more comments. Let's discuss.
core-api/src/main/java/com/optimizely/ab/bucketing/DecisionService.java
Outdated
Show resolved
Hide resolved
|
|
||
| if (decision != null) { | ||
| decisions.add(new DecisionResponse(decision, reasons)); | ||
| decisions.add(new DecisionResponse(decision, reasons, error, decision.cmabUUID)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we have any case we need pass cmabUUID separately though it's already in decision?
core-api/src/main/java/com/optimizely/ab/bucketing/DecisionService.java
Outdated
Show resolved
Hide resolved
core-httpclient-impl/src/main/java/com/optimizely/ab/cmab/DefaultCmabClient.java
Outdated
Show resolved
Hide resolved
core-httpclient-impl/src/main/java/com/optimizely/ab/OptimizelyFactory.java
Outdated
Show resolved
Hide resolved
core-httpclient-impl/src/main/java/com/optimizely/ab/OptimizelyFactory.java
Outdated
Show resolved
Hide resolved
core-api/src/main/java/com/optimizely/ab/cmab/service/DefaultCmabService.java
Outdated
Show resolved
Hide resolved
…nService and adjust tests accordingly
…ervice to utilize it
…djust instance creation logic
…on and enhance cache handling logging
jaeopt
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Bucket cleaning up looks good! A few more changes suggested.
| import static org.mockito.Matchers.any; | ||
| import static org.mockito.Matchers.anyObject; | ||
| import static org.mockito.Matchers.eq; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
these changes not used? clean up.
| */ | ||
| package com.optimizely.ab.internal; | ||
|
|
||
| public interface CacheWithRemove<T> extends Cache<T> { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
java supports default implementation for interface -
We can remove CacheWithRemove and add remove() to Cache, so backward compatible with existing Cache
default void remove(String key) {
// Default implementation does nothing
// Implementations should override this method to provide actual removal functionality
}
| public class DefaultCmabService implements CmabService { | ||
|
|
||
| private final DefaultLRUCache<CmabCacheValue> cmabCache; | ||
| public static final int DEFAULT_CMAB_CACHE_SIZE = 1000; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| public static final int DEFAULT_CMAB_CACHE_SIZE = 1000; | |
| public static final int DEFAULT_CMAB_CACHE_SIZE = 10000; |
Should be consistent with other server-sdks
|
|
||
| private final DefaultLRUCache<CmabCacheValue> cmabCache; | ||
| public static final int DEFAULT_CMAB_CACHE_SIZE = 1000; | ||
| public static final int DEFAULT_CMAB_CACHE_TIMEOUT_SECS = 300; // 5 minutes |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| public static final int DEFAULT_CMAB_CACHE_TIMEOUT_SECS = 300; // 5 minutes | |
| public static final int DEFAULT_CMAB_CACHE_TIMEOUT_SECS = 30*60; // 30 minutes |
Should be consistent with other server-sdks
| /** | ||
| * Set the timeout duration for cached CMAB decisions. | ||
| * | ||
| * Default value is 300 seconds (5 minutes). |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fix this comment too
| /** | ||
| * Set the maximum size of the CMAB cache. | ||
| * | ||
| * Default value is 1000 entries. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fxi this comment too
Summary
Decision Service methods to handle CMAB
Test plan
Added unit tests
Issues
FSSDK-11170